// 所有权
/*
    所有的程序都必须和计算机内存打交道，如何从内存中申请空间来存放程序的运行内容，如何在不需要的时候释放这些空间，成了重中之重，也是所有编程语言设计的难点之一
    在计算机语言不断演变过程中，出现了三种流派：
    - 垃圾回收机制(GC)，在程序运行时不断寻找不再使用的内存，典型代表：Java、Go
    - 手动管理内存的分配和释放, 在程序中，通过函数调用的方式来申请和释放内存，典型代表：C++
    - 通过所有权来管理内存，编译器在编译时会根据一系列规则进行检查
    其中 Rust 选择了第三种，最妙的是，这种检查只发生在编译期，因此对于程序运行期，不会有任何性能上的损失
*/
// 详细讲解：https://course.rs/basic/ownership/ownership.html
fn main() {

    let mut msg = "hahah";
    let mut msg2 = msg;
    println!("{}", msg);

    let num = String::from("say my name");
    println!("{}", type_of(&num));

    let num2 = num.clone();
    println!("{}", num);

}

// 获取变量的类型
fn type_of<T>(_: &T) -> String {
    format!("{}", std::any::type_name::<T>())
}




